#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
根据.proto文件生成的py，生成cpp和python的ros对接代码，使ROS通信可以使用Protobuf
"""

import sys
import ntpath
import imp

from PythonFileUtil import *
from ProtobufROSGenCPP import generate_cpp_ros
from ProtobufROSGenPY import generate_python_ros
from PythonFileUtil import *

if __name__ == '__main__':
    # 参数形式：消息类型（msg/srv/action） 文件名（<file_name>_pb2.py） 存放生成的cpp和python文件的根目录（<out_dir>/）
    if (len(sys.argv) < 3):
        print("[ProtobufROSgen] Usage: ./ProtobufROSgen.py msg/srv/action  <file_name>.proto")
    else:
        msg_type = sys.argv[1]
        proto_py_file = sys.argv[2]
        out_dir = sys.argv[3] + "/"

        file_w_extension = ntpath.basename(proto_py_file)                  # 提取文件名（包括文件扩展名）
        proto_file_src_name = ntpath.splitext(file_w_extension)[0]    # 不包含扩展名的文件名
        proto_py_dir = ntpath.dirname(proto_py_file)                              # proto_py 文件所在目录
        sys.path.append(proto_py_dir+"/../../")

        print("proto_py_file "+proto_py_file)
        # 加载proto的python脚本，反向提取包和类信息
        mod = imp.load_source('DESCRIPTOR', proto_py_file)
        pkg_name = mod.DESCRIPTOR.package
    
        # proto包名不能包含 "."
        if pkg_name.find(".") != -1:
            throw_compilation_error("[ProtobufROSgen] Protobuf package names are not supported: %s"%pkg_name)

        class_names = list(mod.DESCRIPTOR.message_types_by_name)  # 一个proto文件可能包含多个类
        proto_file_name = proto_file_src_name.replace("_pb2", "")

        # 创建 python的ros桥接代码
        py_pkg_dir = '%s/lib/python2.7/dist-packages/%s/%s' %(out_dir, pkg_name,msg_type)
        generate_python_ros(py_pkg_dir,msg_type,proto_file_name, pkg_name, class_names)

        # 创建 cpp 的ros桥接代码
        cpp_pkg_dir = '%s/include/%s/%s' %(out_dir, pkg_name,msg_type)
        generate_cpp_ros(cpp_pkg_dir,msg_type,proto_file_name, pkg_name, class_names)
   